package com.heima.media.service.impl;


import com.alibaba.fastjson.JSON;
import com.alibaba.nacos.common.utils.StringUtils;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.heima.common.util.RequestContextUtil;
import com.heima.media.mapper.WmNewsMapper;
import com.heima.media.service.WmNewsService;
import com.heima.model.common.dtos.PageRequestDto;
import com.heima.model.common.dtos.ResponseResult;
import com.heima.model.media.dto.WmNewsDto;
import com.heima.model.media.dto.WmNewsQueryDto;
import com.heima.model.media.pojos.WmNews;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.stereotype.Service;

import java.util.*;

@Service
public class WmNewsServiceImpl extends ServiceImpl<WmNewsMapper, WmNews> implements WmNewsService {

    @Autowired
    private WmNewsMapper wmNewsMapper;


    @Autowired
    private KafkaTemplate kafkaTemplate;

    /**
     * 分页条件查询文章信息
     *
     * @param dto
     * @return
     */
    @Override
    public ResponseResult search(PageRequestDto<WmNewsQueryDto> dto) {
        //创建分页对象
        IPage<WmNews> iPage = new Page(dto.getPage(), dto.getSize());
        //创建搜索条件
        QueryWrapper<WmNews> queryWrapper = new QueryWrapper<>();
        WmNewsQueryDto body = dto.getBody();
        if (body != null) {
            if (body.getStatus() != null) {
                queryWrapper.eq("status", body.getStatus());
            }
            if (body.getChannelId() != null) {
                queryWrapper.eq("channel_id", body.getChannelId());
            }
            if (body.getKeyword() != null) {
                queryWrapper.eq("title", body.getKeyword());
            }
            if (body.getBeginDate() != null && body.getEndDate() != null) {
                queryWrapper.between("publish_time", body.getBeginDate(), body.getEndDate());
            }
        }
        //执行查询
        IPage<WmNews> wmNewsIPage = wmNewsMapper.selectPage(iPage, queryWrapper);
        return ResponseResult.okResult(wmNewsIPage);
    }

    /**
     * 文章增加
     *
     * @param dto
     * @return
     */
    @Override
    public ResponseResult submit(WmNewsDto dto) {
        //-------文章保存-------//
        //1.将WmNewsDto转成WmNews

        WmNews wmNews = new WmNews();
        BeanUtils.copyProperties(dto, wmNews);
        //2.将数据完善
        //2.1手动转换图片images，图片用逗号拼接
        //2.2封面处理，1是单图，3是3图，0是无图，-1是自动
        //自动处理，从内容中提取图片

        if (dto.getType().intValue() == -1) {
            dto.setImages(contentImages(dto.getContent()));
        }
        if (dto.getImages() != null && dto.getImages().size() > 0) {
            wmNews.setImages(StringUtils.join(dto.getImages().size() > 3 ? dto.getImages().subList(0, 2) : dto.getImages(), ","));
        }
        //2.3保存草稿status=0 ，提交审核status=1
        if (wmNews.getStatus().intValue() == 1) {
            //提交时间
            wmNews.setSubmitedTime(new Date());
        }
        //设置userId
        wmNews.setUserId(RequestContextUtil.getNode("id"));

        //当id为null时表示新增，不为null时表示修改
        if (wmNews.getId() == null) {
            wmNewsMapper.insert(wmNews);
        } else {
            UpdateWrapper<WmNews> wrapper = new UpdateWrapper<>();
            wrapper.eq("id", wmNews.getId());
            wrapper.eq("user_id", wmNews.getUserId());
            wmNewsMapper.update(wmNews, wrapper);
        }
        /*此处文章保存待实现
        目前暂时不实现草稿功能
        */
        //提交，进行内容安全检测 1 表示提交（待审核）
        if (wmNews.getStatus().intValue() == 1) {
            //将内容摘取出来
            //1.提取文本，获取type=text，content，title
            //2.提取图片，content中的图片，images图片
            //3.指定监听结果的MQ名字

            Map<String, Object> resultMap = verifyContent(wmNews);

            //发送到MQ中
            kafkaTemplate.send("verifyQueue", JSON.toJSONString(resultMap));
        }


        return ResponseResult.okResult(null);
    }

    /**
     * MQ内容抽取
     */
    public Map<String, Object> verifyContent(WmNews wmNews) {

        //将内容摘取出来
        HashMap<String, Object> dataMap = new HashMap<>();
        //1.提取文本，获取type=text的文本内容，此处contents为待检测的文本内容
        List<String> contents = contentText(wmNews);
        //标题也需检测
        contents.add(wmNews.getTitle());
        dataMap.put("text", contents);

        //2.提取图片，content中的图片，images图片
        List<String> images = contentImages(wmNews.getContent());
        //封面也需要检测
        if (wmNews.getImages() != null && wmNews.getImages().contains("http")) {
            List<String> newsImages = Arrays.asList(wmNews.getImages().split(","));
            images.addAll(newsImages);
        }
        dataMap.put("images", images);
        //3.原数据存储【原始数据存储】
        dataMap.put("attach", wmNews);
        //4.指定监听结果的MQ名字
        dataMap.put("backQueue", "verifyArticle");
        return dataMap;

    }

    /**
     * 获取文本内容
     *
     * @param wmNews
     * @return
     */
    private List<String> contentText(WmNews wmNews) {
        //将内容由json转换成List<map>

        List<Map> listMap = JSON.parseArray(wmNews.getContent(), Map.class);
        List<String> texts = new ArrayList<String>();
        for (Map map : listMap) {
            String key = map.get("type").toString();
            if (key.equals("text")) {
                texts.add(map.get("value").toString());
            }
        }
        return texts;
    }


    /**
     * 获取内容中的图片
     *
     * @param content
     * @return
     */
    private List<String> contentImages(String content) {
        //将内容由json转换成List<map>
        // Map<String,String> map = JSON.parseObject(dto.getContent(), Map.class);
        List<Map> listMap = JSON.parseArray(content, Map.class);
        List<String> images = new ArrayList<String>();
        for (Map map : listMap) {
            String key = map.get("type").toString();
            if (key.equals("image")) {
                images.add(map.get("value").toString());
            }
        }
        return images;
    }
}
